package cn.cheqi.recovery.background.controller;


import cn.cheqi.recovery.background.dto.DataGridView;
import cn.cheqi.recovery.background.dto.ResultDTO;
import cn.cheqi.recovery.background.entity.User;
import cn.cheqi.recovery.background.mapper.UserMapper;
import cn.cheqi.recovery.background.service.UserService;
import cn.cheqi.recovery.background.utils.SysFileUtils;
import cn.cheqi.recovery.background.vo.OrderVO;
import cn.cheqi.recovery.background.vo.UserVO;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 *  已入驻业主前端控制器
 * </p>
 *
 * @author Robin
 * @since 2020-02-23
 */
@RestController
@RequestMapping("/system/user")
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private UserMapper userMapper;


    /**
     * 加载所有已入驻业主
     * @param userVO
     * @return
     */
    @RequestMapping("/loadAllUsers")
    public DataGridView toLoadAllUsers(UserVO userVO){
        IPage<User> page = new Page<>(userVO.getPage(),userVO.getLimit());
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        //获取查询体内的用户ID
        Long userId = userVO.getUserId();
        //获取查询体内的业主姓名
        String userName = userVO.getUserName();
        //获取查询体内的业主联系方式
        String userPhone = userVO.getUserPhone();
        //判断这三个条件是否为空,若不是则加进查询条件
        if (userId != null){
            wrapper.like("user_id",userId);
        }
        //模糊查询业主姓名
        if (!StringUtils.isBlank(userName)){
            //去掉字符串中的空格
            String nameTrim = userName.replace(" ", "");
            wrapper.like(nameTrim != null,"user_name",nameTrim);
        }
        //模糊查询业主联系方式
        if (!StringUtils.isBlank(userPhone)){
            //去掉字符串中的空格
            String phoneTrim = userPhone.replace(" ", "");
            wrapper.like(phoneTrim != null,"user_phone",phoneTrim);
        }
        //通过id列倒序输出sql结果
        wrapper.orderByDesc("user_id");
        userService.page(page,wrapper);
        return new DataGridView(page.getTotal(),page.getRecords());
    }

    /**
     * 添加用户
     * @param userVO
     * @return
     */
    @PostMapping("/addUser")
    @Transactional
    public ResultDTO addUser(UserVO userVO){
        try{
            //判断userVO中的图片后缀是否以_temp结束
            //如果是,去掉后缀并保存
            if(userVO.getUserPic()!=null && userVO.getUserPic().endsWith("_temp")){
                //去除多余后缀后的名字
                String saveName = SysFileUtils.reNameFile(userVO.getUserPic());
                userVO.setUserPic(saveName);
            }
            //由于userVO继承了User,所以可以以User的形式保存
            userService.save(userVO);
            return new ResultDTO(200,"录入成功");
        } catch (Exception e){
            e.printStackTrace();
            return new ResultDTO(-1,"录入失败");
        }
    }

    /**
     * 通过用户ID删除用户
     * @param userVO
     * @return
     */
    @PostMapping("/deleteUserById")
    @Transactional
    public ResultDTO deleteUserById(UserVO userVO){
        try{
            //判断用户的头像图片是否为默认图片,若不是则删除
            Long userId = userVO.getUserId();
            String avatarUrl = userService.getById(userId).getUserPic();
            if (!avatarUrl.equals(SysFileUtils.Default_Img_Path)){
                SysFileUtils.removeOldFile(avatarUrl);
            }
            userService.removeById(userVO.getUserId());
            return new ResultDTO(200,"删除成功");
        }catch (Exception e){
            e.printStackTrace();
            return new ResultDTO(-1,"删除失败");
        }
    }

    /**
     * 修改用户
     * @param userVO
     * @return
     */
    @PostMapping("/editUser")
    @Transactional
    public ResultDTO editUser(UserVO userVO){
        try{
            //判断是否为默认图片
            if (!(userVO.getUserPic()!=null && userVO.getUserPic().endsWith(SysFileUtils.Default_Img_Path))){
                //判断userVO中的图片后缀是否以_temp结束
                //如果是,去掉后缀并保存
                if(userVO.getUserPic().endsWith("_temp")){
                    //去除多余后缀后的名字
                    String saveName = SysFileUtils.reNameFile(userVO.getUserPic());
                    userVO.setUserPic(saveName);
                    //判断是否为默认图片,如果不是则删除原来的图片
                    String oldPath = userService.getById(userVO.getUserId()).getUserPic();
                    if (!oldPath.equals(SysFileUtils.Default_Img_Path)){
                        SysFileUtils.removeOldFile(oldPath);
                    }
                }
            }
            userService.updateById(userVO);
            return new ResultDTO(200,"修改成功");
        }catch (Exception e){
            e.printStackTrace();
            return new ResultDTO(-1,"修改失败");
        }
    }

    /**
     * 用户头像上传
     * @param multipartFile
     * @return
     */
    @RequestMapping("/file/uploadUserPic")
    public Map<String,Object> uploadUserImg(@RequestParam("file") MultipartFile multipartFile){
        //1.得到文件的老名字
        String oldFileName = multipartFile.getOriginalFilename();
        //2.根据文件名生成新的文件名
        String newName = SysFileUtils.createNewFileName(oldFileName);
        //3.得到当前日期的字符串
        String dirName = DateUtil.format(new Date(),"yyyy-MM-dd");
        //构造用户存储的文件夹
        String userSave = SysFileUtils.User_Save_Folder + dirName;
        //4.构造文件夹
        File dirFile = new File(SysFileUtils.UPLOAD_PATH,userSave);
        //5.判断当前文件夹是否存在
        if (!dirFile.exists()){
            //如果不存在则创建这个文件夹
            dirFile.mkdirs();
        }
        //6.构造文件对象
        File file = new File(dirFile, newName+"_temp");
        //7.把mf里面的图片信息写入file
        try {
            multipartFile.transferTo(file);
        } catch (IOException e) {
            e.printStackTrace();
        }
        Map<String,Object> map = new HashMap<String, Object>();
        //8.返回图片的相对路径
        map.put("path",userSave+"/"+newName+"_temp");
        return map;
    }

    /**
     * 用户头像下载
     * @param path
     * @return
     */
    @RequestMapping("/file/showImgByPath")
    public ResponseEntity<Object> showImgByPath(String path){
        return SysFileUtils.createResponseEntity(path);
    }

    /**
     * 通过用户ID查看该用户的所有订单详情
     * @param userVO
     * @return
     */
    @PostMapping("/findOrdersByUserId")
    public DataGridView findOrdersByUserId(UserVO userVO){
        //分页条件
        Page<User> page = new Page<>();
        if (userVO.getPage() != null && userVO.getLimit() != null){
            page.setPages(userVO.getPage());
            page.setSize(userVO.getLimit());
        }
        List<OrderVO> orderVOS = userMapper.findOrdersByUserId(userVO.getUserId(),page);
        return new DataGridView(page.getTotal(),orderVOS);
    }

    /**
     * 通过业主ID审核业主身份验证信息
     * @param userId
     * @param identityStatus
     * @return
     */
    @PostMapping("/reviewUserById")
    @Transactional
    public ResultDTO reviewUserById(Long userId,Integer identityStatus){
        try {
            UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
            updateWrapper.eq("user_id",userId);
            User user = new User();
            user.setIdentityStatus(identityStatus);
            userService.update(user,updateWrapper);
            return new ResultDTO(200,"审核成功");
        } catch (Exception e) {
            e.printStackTrace();
            return new ResultDTO(-1,"审核失败");
        }
    }
}

